package io.gitee.bowen_lee.netty.bowen.server;

import java.net.InetSocketAddress;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * netty 服务端
 * 
 * @author Bowen
 * @since 2022-01-13 10:18:31
 */
public class ServerMain {
  public static void main(String[] args) throws Exception {
    NioServerSocketChannel channel = new NioServerSocketChannel();

    // 创建事件循环组
    NioEventLoopGroup eventLoop = new NioEventLoopGroup();
    eventLoop.register(channel);

    // 创建通道 管道 添加 博文accept()函数 通道处理器 入参为 事件循环组(selector) 和 我的通道处理器(读写处理器)
    ChannelPipeline channelPipeline = channel.pipeline();

    // 或者使用 io.gitee.bowen_lee.netty.server.BowenBridgeClientChannelHandle 类
    // 这样可以去掉 BowenAcceptChannelHandle 中的@Sharable
    // 不过BowenBridgeClientChannelHandle类中代码不完美...需要修改
    /*
     * 使用此处代码需要注释掉BowenAcceptChannelHandle类 抽象关键字,抽象方法
     * 修改 BowenAcceptChannelHandle类中 标注有'桥梁'字样的所有地方
     * channelPipeline.addLast(new BowenAcceptChannelHandle(eventLoop, new
     * BowenBridgeClientChannelHandle()));
     */
    // 或者使用如下代码
    channelPipeline.addLast(new BowenAcceptChannelHandle(eventLoop) {
      // 业务代码
      @Override
      public void println(ChannelHandlerContext ctx, String msgStr) {
        if ("hello world".equals(msgStr)) {
          System.out.println("回复 received!");
          ctx.writeAndFlush(Unpooled.copiedBuffer("received!".getBytes()));
        }
      }

    });

    // 绑定
    ChannelFuture channelFuture = channel.bind(new InetSocketAddress("127.0.0.1", 9090));

    // 同步等待 绑定成功
    channelFuture.sync();
    System.out.println("server start successful !");

    channelFuture.channel().closeFuture().sync();
    System.out.println("server 结束");

  }

}
